from flask_restful import Resource,reqparse
from flask_shop import models,db
from flask_shop.role import role_api,role_bp
from flask import request
class Roles(Resource):
    def get(self):
        """
        获取角色列表
        """
        try:
            roles=models.Role.query.all()
            # role_list=[]
            # for role in roles:
            #     role_list.append(role.to_dict())
            role_list=[role.to_dict() for role in roles]
            return {'status':200,'msg':'获取角色列表成功','data':role_list}
        except Exception as e:
            return{'status':500,'msg':'获取角色列表失败'}
    def post(self):
        '''
        添加角色
        '''
        # 获取传递到名称  json/js数据
        try:
            name=request.get_json().get('name')
            # 获取传递的描述
            desc=request.get_json().get('desc')
            role=models.Role(name=name,desc=desc)
            db.session.add(role)
            db.session.commit()
            return {'status':200,'msg':'添加角色成功'}
        except Exception as e:
            return {'status':500,'msg':'添加角色失败'}
role_api.add_resource(Roles,'/roles/')
      
class Role(Resource):
    def delete(self,id):
        """
        删除角色
        """
        try:
            role=models.Role.query.get(id)
            db.session.delete(role)
            db.session.commit()
            return {'status':200,'msg':'删除角色成功'}
        except Exception as e:
            return {'status':500,'msg':'删除角色失败'}
    def put(self,id):
        """
        修改角色
        """
        try:
            role=models.Role.query.get(id)
            # 创建RequestParser对象
            parser=reqparse.RequestParser()
            # 添加数据
            parser.add_argument('name',type=str,required=True,help='请输入角色名称')
            parser.add_argument('desc',type=str,help='请输入角色描述')
            # 解析数据
            args=parser.parse_args()
            if args.get('name'):
                role.name=args.name
            if args.get('desc'):
                role.desc=args.desc
            db.session.commit()
            return {'status':200,'msg':'修改角色成功'}
        except Exception as e:
            return {'status':500,'msg':'修改角色失败'}
role_api.add_resource(Role,'/role/<int:id>/') 

@role_bp.route('/role/<int:rid>/<int:mid>/')
def del_menu(rid:int,mid:int):
    # 查找角色信息
    role=models.Role.query.get(rid)
    # 查找菜单信息
    menu=models.Menu.query.get(mid)
    # 判断当前角色与菜单是否存在
    if all([role,menu]):
        # 判断角色是否有当前权限
        if menu in role.menus:
            # 删除当前角色当前权限
            role.menus.remove(menu)
            # 判断当前菜单是否是父级菜单
            if menu.level==1:
                # 删除当前父级菜单的子菜单
                for temp in menu.children:
                    # 判断当前角色是否有当前子菜单
                    if temp in role.menus:
                        # 删除当前角色的当前子菜单
                        role.menus.remove(temp)
            db.session.commit()
            return {'status':'500','msg':'删除角色成功'}
    else:
        return {'status':500,'msg':'角色或菜单不存在'}
    
@role_bp.route('/role/<int:rid>/',methods=['POST'])
def set_menu(rid:int):
    try:
        # 获取当前角色信息
        role=models.Role.query.get(rid)
        # 获取要分配的权限
        mids=request.get_json().get('mids')
        # 清空所有权限
        role.menus=[]
        # 遍历所有权限
        mids=mids.split(',')
        for m in mids:  #判断m是否为空
            if m :
                # 获取权限
                menu=models.Menu.query.get(int(m))
                #分配权限
                role.menus.append(menu)         
        #保存在数据库
        db.session.commit()
        #返回结果
        return {'status':200,'msg':'分配权限成功'}
    except Exception as e:
        return {'status':500,'msg':'分配权限失败'}